//
// Created by Administrator on 2022/11/9.
//
#include <global.h>
#include <memory.h>
#include <interrupt.h>
#include <logf.h>
#include <task.h>
#include <kernel.h>
#include <list.h>
#include <semaphore.h>
#include <memory32.h>
#include <assert.h>
#include <disk.h>

void os_init(memory_info_t* mem_info, uint32_t gdt_info)
{
    // 测试数据结构
    test_list();
    // 初始化内存
    init_memory(mem_info);
    // 初始化中断
    init_interrupt();
    // 初始化屏幕
    init_logf();
    logf("Version: 1.0, name: %s", "tiny x86 os");
    // 初始化GDT
    init_gdt32((gdt_table_t *)gdt_info);
    // 初始化任务队列
    init_task_queue();
    // 初始化硬盘
    init_disk();
    // 初始化default task
    init_default_task();
    // 跳转到default task
    task_t *task = get_running_task();
    ASSERT(task != NULL);
    tss_t *tss = &task->tss;
    __asm__ volatile("push %[ss];"
            "push %[esp];"
            "push %[eflags];"
            "push %[cs];"
            "push %[eip];"
            "iret;"
            ::[ss]"r"(tss->ss), [esp]"r"(tss->esp),
            [eflags]"r"(tss->eflags), [cs]"r"(tss->cs), [eip]"r"(tss->eip));
}